package scala.day02

object Demo02Fun02 {
  def main(args: Array[String]): Unit = {
    /**
      *面向对象编程：将一个对象传来传去，
      * 1、将一个对象作为参数
      * 2、将一个对象作为返回值
      *
      * 需要明确对象的类型，以及参数的类型，返回值的类型
      *
      * 面向函数编程（高阶函数），将一个函数传来传去
      * 1、将一个函数作为参数 --重点
      * 2、将一个函数作为返回值 --忽略
      *
      *
      * 函数的类型和返回值，参数有关，和函数名，函数体无关
      *
      *
      * 例
      * def stringToInt(str:String):Int = str.toInt
      * 这是一个参数为String 返回这为Int类型的函数
      *
      *
      */
    def stringToInt(str: String ):  Int = str.toInt

    /**
      * 1、以函数作为参数
      *
      *
      * String => Int
      * 前面代表的是参数的类型
      * 后面代表的是返回值的类型
      */
    //fun的参数是一个函数，是一个参数为string返回值为Int类型的函数
    def fun(f:String => Int):Unit = {
      //f相当于函数的引用
      val i:Int = f("1000")
      println("fun:"+i)
    }
    //定义一个参数为String，返回值为Int类型的函数
    def sToi(s:String):Int = s.toInt
    //调用fun：这个函数需要一个参数为String，返回值为Int的函数作为参数
    fun(sToi)
    def sTo2(s:String):Int = {
      s.toInt + 100
    }
    //高级函数可以多次调用传入不同的函数
    fun(sTo2)
  }
}
